T-gateway api 설치 및 간단 테스트
개요
게아를 한번 직접 써보는 시간을 가지자.
예전에도 간단하게나마 시도는 했지만 그때의 수준은 너무 미약했던 것 같다.
안그래도 Keycloak을 쿠버네티스 인증 OIDC로 사용하려는 만큼, TLS 세팅도 진행한다.
어떤 구현체?
이게 사실 잘 모르겠다.
많은 구현체가 있으나 비교 글도 많지 않고 대체로 뭘 쓰는지에 대한 정보도 딱히 없는 것 같다.
그래서 당장은 내게 익숙한 nginx fabric나, 그나마 사람들이 쓰는 것 같은 kong을 써보려고 한다.
설치
이번에도 헬름을 이용해본다.
helm install nginx-gateway oci://ghcr.io/nginx/charts/nginx-gateway-fabric --create-namespace -n nginx-gateway
이건 nginx.
helm repo add kong https://charts.konghq.com
helm repo update kong
helm upgrade --install kgo kong/gateway-operator -n kong-system --create-namespace --set image.tag=1.4 --set kubernetes-configuration-crds.enabled=true --set env.ENABLE_CONTROLLER_KONNECT=true
이건 kong[1]
이 헬름에서는 gateway api 자체도 추가시켜준다.
gateway api 세팅
기본이 되는 녀석들을 구성해보자.
첫번째는 gatewayClass인데, 이전에 kong에서는 데이터 플레인, 컨트롤 플레인 관련을 설정을 추가적으로 해줘야 한다.
이때 gatewayConfiguration을 먼저 만들어 사용할 수 있다.
kind: GatewayConfiguration
apiVersion: gateway-operator.konghq.com/v1beta1
metadata:
name: kong
namespace: kong-system
spec:
dataPlaneOptions:
deployment:
podTemplateSpec:
spec:
containers:
- name: proxy
image: kong:3.9.0
readinessProbe:
initialDelaySeconds: 1
periodSeconds: 1
controlPlaneOptions:
deployment:
podTemplateSpec:
spec:
containers:
- name: controller
image: kong/kubernetes-ingress-controller:3.4.1
env:
- name: CONTROLLER_LOG_LEVEL
value: debug'
이런 식으로 세팅을 해준다.
이렇게 하기 싫다면 또 데이터 플레인, 컨트롤 플레인을 각각 또 crd로 넣는 것도 가능하다.
apiVersion: gateway.networking.k8s.io/v1
kind: GatewayClass
metadata:
name: kong-gateway-class
spec:
controllerName: konghq.com/gateway-operator
parametersRef:
group: gateway-operator.konghq.com
kind: GatewayConfiguration
name: kong
namespace: kong-system
시작은 간단하게 해본다.
여기에 추가적인 설정을 넣는 것도 가능하고, kong의 경우 configuration CRD까지 제공하고 있어 더 상세한 커스텀이 가능하다.
status가 accepted로 되면 잘 된 것이다.
다음은 gateway 세팅인데, 뭔가 또 안 된다.
이거 최근에 숱하게 봤는데, CoreDNS로 트래픽은 가지만 응답 트래픽이 돌아가지 않을 때 발생하는 문제였다.
클러스터를 껐다킬 때, 노드가 안전하게 종료되지 않아서 iptables에 문제가 생기고 이로 인해 응답 트래픽이 가는 규칙에 문제가 생기는 것이라 짐작하고 있다.
k -n kube-system rollout restart deploy corends
안 되면 재시작하면 된다.
나중에는 메트릭 수집하면서 문제 생길시 알아서 리스타트하게 만들어야겠다.
라고 생각했는데.. 계속 해결이 되지 않았다.
그래서 그냥 웹훅 정책을 그냥 무시로 바꿔봤다.
문제 생기면 다시 밀고 설치하지 뭐..
글쎄, 오히려 잘 된 듯하다.
kind: Gateway
metadata:
name: keycloak-gateway
namespace: keycloak
spec:
gatewayClassName: kong-gateway-class
listeners:
- protocol: HTTPS
port: 443
name: keycloak-https
hostname: keycloak.local
tls:
mode: Terminate
certificateRefs:
- kind: Secret
group: ""
name: tls-creds
게이트웨이 객체는 일단 이렇게 만들어줬다.
TLS를 사용하도록, 호스트네임으로 인증서도 발급 받아서 넣어주었다.
이제 여기에 route 객체들을 박아주면 된다!
라우트를 넣지 않고 그냥 했더니 이렇게 나온다.
되는대로 라우트를 때려박았는데, 이런 식으로 컨플릭도 뜬다.
에러 원인을 편하게 추적할 수 있다니 이건 혁신이야..
kind: HTTPRoute
apiVersion: gateway.networking.k8s.io/v1
metadata:
name: keycloak-test
namespace: keycloak
spec:
parentRefs:
- name: keycloak-gateway
namespace: keycloak
# hostnames:
# - "keycloak.local"
rules:
- matches:
- path:
type: PathPrefix
value: /nginx
- backendRefs:
- name: test
port: 80
서비스를 하나 띄우고, 이런 식으로 일단 테스트 중이다.
연결된 라우트는 게이트웨이 쪽에서도 확인된다.
성공적으로 되는 모습이다.
위에 객체 설정에서 backendRefs
의 들여쓰기를 잘못해서 잠시 착각했는데, 기본 백엔드가 nginx로 연결돼있어서 이렇게 들어가는 게 정상이다.
되긴 하는데, 내가 원하는 것처럼 되지는 않는다.
오히려 해당 룰의 백엔드를 안 걸었더니 이런 에러가 뜬다.
보통이었으면 nginx의 404 에러가 떠야 하는데 주목할 만한 상황이다.
찾은 실수가 있었는데, 그 이상으로 또 문제가 있는 부분들을 찾았다.
하도 안 돼서 몇 번 껐다켜보기를 반복했다.
그런데 어떤 라우트를 먼저 넣냐에 따라 계속 결과가 달라졌다..
호스트 네임 설정 관련 이슈가 있었나?
kind: HTTPRoute
apiVersion: gateway.networking.k8s.io/v1
metadata:
name: keycloak-http2https
namespace: keycloak
spec:
parentRefs:
- name: keycloak-gateway
namespace: keycloak
sectionName: keycloak-http
# hostnames:
# - keycloak.local
rules:
- filters:
- type: RequestRedirect
requestRedirect:
scheme: https
statusCode: 301
---
kind: HTTPRoute
apiVersion: gateway.networking.k8s.io/v1
metadata:
name: keycloak-default-route
namespace: keycloak
spec:
parentRefs:
- group: gateway.networking.k8s.io
kind: Gateway
name: keycloak-gateway
namespace: keycloak
sectionName: keycloak-https
hostnames:
- keycloak.local
rules:
- matches:
- path:
# type: PathPrefix
value: /
backendRefs:
- name: keycloak
port: 80
일단 성공시킨 라우트의 양식은 이러하다.
80으로 들어오면 https로 리디렉트를 시키려고 했다.
근데 키클록에서 리디렉션시키는 주소가 또 http라서 적용이 안 돼버린다;
내가 validating webhook을 ignore시켜서 그런 것일 수도 있지만, 설정을 동적으로 변경시킬 수 있는 건지 아닌지가 제대로 구분되지 않아 테스트에 시간이 많이 지체되고 있다.
지금까지 겪은 이상한 상황은 이렇다.
- http에서 리디렉팅을 시키는 라우트와 기본 라우트를 한꺼번에 게이트웨이에 추가하면 에러가 난다.
- 그러나 기본 라우트가 완전히 붙은 이휴에 리디렉팅 라우트를 추가하면 http로 리디렉팅(키클록 내부 리디렉션 때문)된다.
분명하게 오브젝트를 만드는 순서에 결과가 영향을 받고 있다.
문서 정리가 완료되기 전까지 이후 내용은 Keycloak에 담도록 하겠다.
관련 문서
이름 | noteType | created |
---|